package avicit.bdp.dds.dao.mapper;

import avicit.bdp.common.base.BaseDAO;
import avicit.bdp.dds.dao.entity.UdfFunc;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * udf function mapper interface
 */
public interface UdfFuncMapper extends BaseDAO<UdfFunc> {

    /**
     * select udf by id
     *
     * @param id udf id
     * @return UdfFunc
     */
    UdfFunc selectUdfById(@Param("id") String id);

    /**
     * query udf function by ids and function name
     *
     * @param ids       ids
     * @param funcNames funcNames
     * @return udf function list
     */
    List<UdfFunc> queryUdfByIdStr(@Param("ids") String[] ids,
                                  @Param("funcNames") String funcNames);

    /**
     * udf function page
     *
     * @param userId    userId
     * @param searchVal searchVal
     * @return udf function IPage
     */
    Page<UdfFunc> queryUdfFuncPaging(@Param("userId") String userId,
                                     @Param("searchVal") String searchVal);

    /**
     * query udf function by type
     *
     * @param userId userId
     * @param type   type
     * @return udf function list
     */
    List<UdfFunc> getUdfFuncByType(@Param("userId") String userId,
                                   @Param("type") Integer type);

    /**
     * query udf function except userId
     *
     * @param userId userId
     * @return udf function list
     */
    List<UdfFunc> queryUdfFuncExceptUserId(@Param("userId") String userId);

    /**
     * query authed udf function
     *
     * @param userId userId
     * @return udf function list
     */
    List<UdfFunc> queryAuthedUdfFunc(@Param("userId") String userId);

    /**
     * list authorized UDF function
     *
     * @param userId userId
     * @param udfIds UDF function id array
     * @return UDF function list
     */
    <T> List<UdfFunc> listAuthorizedUdfFunc(@Param("userId") String userId, @Param("udfIds") T[] udfIds);

    /**
     * list UDF by resource id
     *
     * @param resourceIds resource id array
     * @return UDF function list
     */
    List<UdfFunc> listUdfByResourceId(@Param("resourceIds") String[] resourceIds);

    /**
     * list authorized UDF by resource id
     *
     * @param userId      user id
     * @param resourceIds resource id array
     * @return UDF function list
     */
    List<UdfFunc> listAuthorizedUdfByResourceId(@Param("userId") String userId,
                                                @Param("resourceIds") String[] resourceIds);


    /**
     * 查询自定义函数集合
     *
     * @param typeIds   类型ID集合
     * @param projectId 项目空间ID
     * @param keyWords  关键词
     * @return 自定义函数集合
     */
    Page<UdfFunc> getList(@Param("typeIds") List<String> typeIds,
                          @Param("engineId") String engineId,
                          @Param("projectId") String projectId,
                          @Param("keyWords") String keyWords);


    /**
     * 通过项目空间查询UDF列表
     *
     * @param projectId 项目空间ID
     * @param type      类型：0--hiveUDF；1--sparkUDF
     * @return UDF列表
     */
    List<UdfFunc> getListByProjectIdAndType(@Param("projectId") String projectId,
                                            @Param("type") Integer type);


    List<UdfFunc> getName(@Param("name") String name, @Param("projectId") String projectId);

    List<UdfFunc> getFuncName(@Param("funcName") String funcName, @Param("projectId") String projectId);
}
